package com.zhentao.ai.example;

import com.zhentao.ai.algorithm.SimpleAnomalyDetector;
import com.zhentao.ai.model.DataPoint;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 异常检测算法使用示例
 *
 * 这个例子演示如何使用异常检测算法来发现系统参数的异常变化
 *
 * @author zhentao
 * @date 2024-12-19
 */
public class AnomalyDetectionExample {

    public static void main(String[] args) {
        // 创建异常检测器
        SimpleAnomalyDetector detector = new SimpleAnomalyDetector();

        // 演示1：数据库连接数异常检测
        System.out.println("=== 演示1：数据库连接数异常检测 ===");
        detectDatabaseConnectionAnomalies(detector);

        System.out.println("\n" + "=".repeat(50) + "\n");

        // 演示2：缓存命中率异常检测
        System.out.println("=== 演示2：缓存命中率异常检测 ===");
        detectCacheHitRateAnomalies(detector);
    }

    /**
     * 演示1：检测数据库连接数异常
     *
     * 场景说明：
     * 某个系统的数据库连接数平时在80-120之间波动，
     * 但在某天突然飙升到500，这明显是异常情况，
     *
     * 可能是因为系统故障、恶意攻击或者配置错误。
     */
    private static void detectDatabaseConnectionAnomalies(SimpleAnomalyDetector detector) {
        List<DataPoint> connectionData = new ArrayList<>();
        LocalDateTime baseTime = LocalDateTime.now().minusDays(10);

        // 模拟10天的数据库连接数数据
        // 前8天都是正常的（80-120之间）
        connectionData.add(new DataPoint(baseTime.plusDays(0), BigDecimal.valueOf(95)));   // 正常
        connectionData.add(new DataPoint(baseTime.plusDays(1), BigDecimal.valueOf(102)));  // 正常
        connectionData.add(new DataPoint(baseTime.plusDays(2), BigDecimal.valueOf(88)));   // 正常
        connectionData.add(new DataPoint(baseTime.plusDays(3), BigDecimal.valueOf(115)));  // 正常
        connectionData.add(new DataPoint(baseTime.plusDays(4), BigDecimal.valueOf(92)));   // 正常
        connectionData.add(new DataPoint(baseTime.plusDays(5), BigDecimal.valueOf(108)));  // 正常
        connectionData.add(new DataPoint(baseTime.plusDays(6), BigDecimal.valueOf(85)));   // 正常
        connectionData.add(new DataPoint(baseTime.plusDays(7), BigDecimal.valueOf(98)));   // 正常

        // 第9天突然异常飙升！
        connectionData.add(new DataPoint(baseTime.plusDays(8), BigDecimal.valueOf(500)));  // 异常！

        // 第10天恢复正常
        connectionData.add(new DataPoint(baseTime.plusDays(9), BigDecimal.valueOf(105)));  // 正常

        // 执行异常检测
        SimpleAnomalyDetector.SimpleAnomalyResult result = detector.detectAnomalies(connectionData);

        // 输出检测结果
        System.out.println("数据库连接数异常检测结果：");
        System.out.println(result.generateReport());

        // 解释结果
        if (result.getAnomalyCount() > 0) {
            System.out.println("💡 结果解释：");
            System.out.println("   检测到数据库连接数异常！");
            System.out.println("   正常情况下连接数在" + (result.getAverage() - 3 * result.getStandardDeviation())
                             + "到" + (result.getAverage() + 3 * result.getStandardDeviation()) + "之间");
            System.out.println("   建议立即检查：");
            System.out.println("   1. 是否有大量并发请求");
            System.out.println("   2. 是否有程序没有正确释放连接");
            System.out.println("   3. 是否遭受了DoS攻击");
        }
    }

    /**
     * 演示2：检测缓存命中率异常
     *
     * 场景说明：
     * 某个系统的缓存命中率平时在85%-95%之间，
     * 但突然降到20%，说明缓存可能出现问题，
     * 需要及时处理以避免数据库压力过大。
     */
    private static void detectCacheHitRateAnomalies(SimpleAnomalyDetector detector) {
        List<DataPoint> cacheHitData = new ArrayList<>();
        LocalDateTime baseTime = LocalDateTime.now().minusDays(7);

        // 模拟7天的缓存命中率数据（用百分比，所以是0-100的数字）
        cacheHitData.add(new DataPoint(baseTime.plusDays(0), BigDecimal.valueOf(92.5)));  // 正常
        cacheHitData.add(new DataPoint(baseTime.plusDays(1), BigDecimal.valueOf(89.8)));  // 正常
        cacheHitData.add(new DataPoint(baseTime.plusDays(2), BigDecimal.valueOf(94.2)));  // 正常
        cacheHitData.add(new DataPoint(baseTime.plusDays(3), BigDecimal.valueOf(87.6)));  // 正常
        cacheHitData.add(new DataPoint(baseTime.plusDays(4), BigDecimal.valueOf(91.3)));  // 正常

        // 第6天缓存命中率突然下降！
        cacheHitData.add(new DataPoint(baseTime.plusDays(5), BigDecimal.valueOf(23.1)));  // 异常！

        // 第7天依然很低
        cacheHitData.add(new DataPoint(baseTime.plusDays(6), BigDecimal.valueOf(18.7)));  // 异常！

        // 执行异常检测
        SimpleAnomalyDetector.SimpleAnomalyResult result = detector.detectAnomalies(cacheHitData);

        // 输出检测结果
        System.out.println("缓存命中率异常检测结果：");
        System.out.println(result.generateReport());

        // 解释结果
        if (result.getAnomalyCount() > 0) {
            System.out.println("💡 结果解释：");
            System.out.println("   检测到缓存命中率异常下降！");
            System.out.println("   正常情况下命中率应该在" + (result.getAverage() - 3 * result.getStandardDeviation())
                             + "%到" + (result.getAverage() + 3 * result.getStandardDeviation()) + "%之间");
            System.out.println("   建议立即检查：");
            System.out.println("   1. 缓存服务器是否正常运行");
            System.out.println("   2. 缓存配置是否被修改");
            System.out.println("   3. 是否有大量新的查询请求");
            System.out.println("   4. 缓存空间是否不足导致频繁清理");
        }
    }
}

